{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "acf7c55ccff728d3",
   "metadata": {},
   "source": [
    "Copyright (c) MONAI Consortium  \n",
    "Licensed under the Apache License, Version 2.0 (the \"License\");  \n",
    "you may not use this file except in compliance with the License.  \n",
    "You may obtain a copy of the License at  \n",
    "&nbsp;&nbsp;&nbsp;&nbsp;http://www.apache.org/licenses/LICENSE-2.0  \n",
    "Unless required by applicable law or agreed to in writing, software  \n",
    "distributed under the License is distributed on an \"AS IS\" BASIS,  \n",
    "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  \n",
    "See the License for the specific language governing permissions and  \n",
    "limitations under the License."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "63d95da6",
   "metadata": {},
   "source": [
    "# Diffusion Models for Medical Anomaly Detection with Classifier Guidance\n",
    "\n",
    "This tutorial illustrates how to use MONAI for training a 2D gradient-guided anomaly detection using DDIMs [1].\n",
    "\n",
    "We train a diffusion model on 2D slices of brain MR images. A classification model is trained to predict whether the given slice shows a tumor or not.\\\n",
    "We then translate an input slice to its healthy reconstruction using DDIMs.\\\n",
    "Anomaly detection is performed by taking the difference between input and output, as proposed in [1].\n",
    "\n",
    "[1] - Wolleb et al. \"Diffusion Models for Medical Anomaly Detection\" https://arxiv.org/abs/2203.04306\n",
    "\n",
    "## Setup environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "75f2d5f3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-12T11:07:08.178125Z",
     "start_time": "2024-09-12T11:07:01.326090Z"
    }
   },
   "outputs": [],
   "source": [
    "!python -c \"import monai\" || pip install -q \"monai-weekly[pillow, tqdm]\"\n",
    "!python -c \"import matplotlib\" || pip install -q matplotlib\n",
    "!python -c \"import seaborn\" || pip install -q seaborn"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b766027",
   "metadata": {},
   "source": [
    "## Setup imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "972ed3f3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-10T17:26:57.964290Z",
     "start_time": "2024-09-10T17:26:55.003899Z"
    },
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MONAI version: 1.4.dev2434\n",
      "Numpy version: 1.26.4\n",
      "Pytorch version: 2.4.0+cu121\n",
      "MONAI flags: HAS_EXT = False, USE_COMPILED = False, USE_META_DICT = False\n",
      "MONAI rev id: dc611d231ba670004b1da1b011fe140375fb91af\n",
      "MONAI __file__: /home/<username>/monaigen-tutorials-v2/venv/lib/python3.11/site-packages/monai/__init__.py\n",
      "\n",
      "Optional dependencies:\n",
      "Pytorch Ignite version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "ITK version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "Nibabel version: 5.2.1\n",
      "scikit-image version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "scipy version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "Pillow version: 10.4.0\n",
      "Tensorboard version: 2.17.1\n",
      "gdown version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "TorchVision version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "tqdm version: 4.66.5\n",
      "lmdb version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "psutil version: 6.0.0\n",
      "pandas version: 2.2.2\n",
      "einops version: 0.8.0\n",
      "transformers version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "mlflow version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "pynrrd version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "clearml version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "\n",
      "For details about installing the optional dependencies, please visit:\n",
      "    https://docs.monai.io/en/latest/installation.html#installing-the-recommended-dependencies\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import time\n",
    "import tempfile\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "from monai import transforms\n",
    "from monai.apps import DecathlonDataset\n",
    "from monai.config import print_config\n",
    "from monai.data import DataLoader\n",
    "from monai.utils import set_determinism\n",
    "from torch.amp import GradScaler, autocast\n",
    "from tqdm import tqdm\n",
    "\n",
    "from monai.inferers import DiffusionInferer\n",
    "from monai.networks.nets.diffusion_model_unet import DiffusionModelEncoder, DiffusionModelUNet\n",
    "from monai.networks.schedulers.ddim import DDIMScheduler\n",
    "\n",
    "torch.multiprocessing.set_sharing_strategy(\"file_system\")\n",
    "\n",
    "print_config()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d4ff515",
   "metadata": {},
   "source": [
    "## Setup data directory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8b4323e7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-10T17:26:57.971391Z",
     "start_time": "2024-09-10T17:26:57.966830Z"
    },
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "directory = os.environ.get(\"MONAI_DATA_DIRECTORY\")\n",
    "root_dir = tempfile.mkdtemp() if directory is None else directory"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99175d50",
   "metadata": {},
   "source": [
    "## Set deterministic training for reproducibility"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "34ea510f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-10T17:26:57.990361Z",
     "start_time": "2024-09-10T17:26:57.972708Z"
    },
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "set_determinism(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3f70dd1-236a-47ff-a244-575729ad92ba",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Preprocessing of the BRATS Dataset in 2D slices for training\n",
    "We download the BRATS training dataset from the Decathlon dataset. \\\n",
    "We slice the volumes in axial 2D slices, and assign slice-wise labels (0 for healthy, 1 for diseased) to all slices.\n",
    "Here we use transforms to augment the training dataset:\n",
    "\n",
    "1. `LoadImaged` loads the brain MR images from files.\n",
    "2. `EnsureChannelFirstd` ensures the original data to construct \"channel first\" shape.\n",
    "2. `ScaleIntensityRangePercentilesd` takes the lower and upper intensity percentiles and scales them to [0, 1].\n",
    "3. The first `Lambdad` transform selects a pre-defined channel, in this case, channel zero, representing the FLAIR images.\n",
    "4. The `CopyItemsd` transform creates a copy of the label called slice_label\n",
    "5. The final `Lambdad` transform sets the slice_label variable to one if there are no non-zero pixels in it, and zero otherwise.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c68d2d91-9a0b-4ac1-ae49-f4a64edbd82a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-10T17:28:01.703855Z",
     "start_time": "2024-09-10T17:28:01.691335Z"
    }
   },
   "outputs": [],
   "source": [
    "channel = 0  # 0 = Flair\n",
    "assert channel in [0, 1, 2, 3], \"Choose a valid channel\"\n",
    "\n",
    "train_transforms = transforms.Compose(\n",
    "    [\n",
    "        transforms.LoadImaged(keys=[\"image\", \"label\"]),\n",
    "        transforms.EnsureChannelFirstd(keys=[\"image\", \"label\"]),\n",
    "        transforms.Lambdad(keys=[\"image\"], func=lambda x: x[channel, :, :, :]),\n",
    "        transforms.EnsureChannelFirstd(keys=[\"image\"], channel_dim=\"no_channel\"),\n",
    "        transforms.EnsureTyped(keys=[\"image\", \"label\"]),\n",
    "        transforms.Orientationd(keys=[\"image\", \"label\"], axcodes=\"RAS\"),\n",
    "        transforms.Spacingd(keys=[\"image\", \"label\"], pixdim=(3.0, 3.0, 2.0), mode=(\"bilinear\", \"nearest\")),\n",
    "        transforms.CenterSpatialCropd(keys=[\"image\", \"label\"], roi_size=(64, 64, 44)),\n",
    "        transforms.ScaleIntensityRangePercentilesd(keys=\"image\", lower=0, upper=99.5, b_min=0, b_max=1),\n",
    "        transforms.RandSpatialCropd(keys=[\"image\", \"label\"], roi_size=(64, 64, 1), random_size=False),\n",
    "        transforms.Lambdad(keys=[\"image\", \"label\"], func=lambda x: x.squeeze(-1)),\n",
    "        transforms.CopyItemsd(keys=[\"label\"], times=1, names=[\"slice_label\"]),\n",
    "        transforms.Lambdad(keys=[\"slice_label\"], func=lambda x: 0.0 if x.sum() > 0 else 1.0),\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "da1927b0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-10T17:49:04.424018Z",
     "start_time": "2024-09-10T17:28:10.817487Z"
    },
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Task01_BrainTumour.tar: 7.09GB [15:16, 8.30MB/s]                                "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2024-09-10 18:43:27,806 - INFO - Downloaded: /tmp/tmp_1zmh1hd/Task01_BrainTumour.tar\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2024-09-10 18:43:41,662 - INFO - Verified 'Task01_BrainTumour.tar', md5: 240a19d752f0d9e9101544901065d872.\n",
      "2024-09-10 18:43:41,663 - INFO - Writing into directory: /tmp/tmp_1zmh1hd.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading dataset: 100%|██████████| 388/388 [05:10<00:00,  1.25it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Length of training data: 388\n",
      "Train image shape torch.Size([1, 64, 64])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "batch_size = 64\n",
    "\n",
    "train_ds = DecathlonDataset(\n",
    "    root_dir=root_dir,\n",
    "    task=\"Task01_BrainTumour\",\n",
    "    section=\"training\",  # validation\n",
    "    cache_rate=1.0,  # you may need a few Gb of RAM... Set to 0 otherwise\n",
    "    num_workers=4,\n",
    "    download=True,  # Set download to True if the dataset hasn't been downloaded yet\n",
    "    seed=0,\n",
    "    transform=train_transforms,\n",
    ")\n",
    "\n",
    "print(f\"Length of training data: {len(train_ds)}\")  # this gives the number of patients in the training set\n",
    "print(f'Train image shape {train_ds[0][\"image\"].shape}')\n",
    "\n",
    "train_loader = DataLoader(\n",
    "    train_ds, batch_size=batch_size, shuffle=True, num_workers=4, drop_last=True, persistent_workers=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fac55e9d",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Preprocessing of the BRATS Dataset in 2D slices for validation\n",
    "We download the BRATS validation dataset from the Decathlon dataset, and define the dataloader to load 2D slices for validation.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "73d72110-a8b3-4e03-91cc-1dab4d5a7b87",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T14:16:09.071265Z",
     "start_time": "2024-09-11T14:14:26.241877Z"
    },
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2024-09-11 15:14:45,612 - INFO - Verified 'Task01_BrainTumour.tar', md5: 240a19d752f0d9e9101544901065d872.\n",
      "2024-09-11 15:14:45,614 - INFO - File exists: /tmp/tmp_1zmh1hd/Task01_BrainTumour.tar, skipped downloading.\n",
      "2024-09-11 15:14:45,615 - INFO - Non-empty folder exists in /tmp/tmp_1zmh1hd/Task01_BrainTumour, skipped extracting.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading dataset: 100%|██████████| 96/96 [01:23<00:00,  1.15it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Length of training data: 96\n",
      "Validation Image shape torch.Size([1, 64, 64])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "val_ds = DecathlonDataset(\n",
    "    root_dir=root_dir,\n",
    "    task=\"Task01_BrainTumour\",\n",
    "    section=\"validation\",\n",
    "    cache_rate=1.0,  # you may need a few Gb of RAM... Set to 0 otherwise\n",
    "    num_workers=4,\n",
    "    download=True,  # Set download to True if the dataset hasn't been downloaded yet\n",
    "    seed=0,\n",
    "    transform=train_transforms,\n",
    ")\n",
    "print(f\"Length of training data: {len(val_ds)}\")\n",
    "print(f'Validation Image shape {val_ds[0][\"image\"].shape}')\n",
    "\n",
    "val_loader = DataLoader(\n",
    "    val_ds, batch_size=batch_size, shuffle=False, num_workers=4, drop_last=True, persistent_workers=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08428bc6",
   "metadata": {},
   "source": [
    "## Define network, scheduler, optimizer, and inferer\n",
    "At this step, we instantiate the MONAI components to create a DDIM, the UNET, the noise scheduler, and the inferer used for training and sampling. We are using\n",
    "the deterministic DDIM scheduler containing 1000 timesteps, and a 2D UNET with attention mechanisms\n",
    "in the 3rd level (`num_head_channels=64`).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "bee5913e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T14:16:09.525685Z",
     "start_time": "2024-09-11T14:16:09.073105Z"
    },
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "lines_to_next_cell": 2
   },
   "outputs": [],
   "source": [
    "device = torch.device(\"cuda\")\n",
    "\n",
    "model = DiffusionModelUNet(\n",
    "    spatial_dims=2,\n",
    "    in_channels=1,\n",
    "    out_channels=1,\n",
    "    channels=(64, 64, 64),\n",
    "    attention_levels=(False, False, True),\n",
    "    num_res_blocks=1,\n",
    "    num_head_channels=64,\n",
    "    with_conditioning=False,\n",
    ")\n",
    "model.to(device)\n",
    "\n",
    "scheduler = DDIMScheduler(num_train_timesteps=1000)\n",
    "\n",
    "optimizer = torch.optim.Adam(params=model.parameters(), lr=2.5e-5)\n",
    "\n",
    "inferer = DiffusionInferer(scheduler)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a4d3ab2",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Model training of the diffusion model\n",
    "We train our diffusion model for 2000 epochs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6c0ed909",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T14:51:54.274020Z",
     "start_time": "2024-09-11T14:16:09.528155Z"
    },
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0 Validation loss 0.49252671003341675\n",
      "Epoch 20 Validation loss 0.22828049957752228\n",
      "Epoch 40 Validation loss 0.08093317598104477\n",
      "Epoch 60 Validation loss 0.03429413586854935\n",
      "\n",
      "Epoch 1960 Validation loss 0.013749875128269196\n",
      "Epoch 1980 Validation loss 0.007845446467399597\n",
      "train diffusion completed, total time: 2144.4541273117065.\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkEAAAHZCAYAAACB2e8eAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACEB0lEQVR4nO3dd3hT5d8G8PtkdreUDlpoS9mbMsuSIQoIspQhIEsU9MUBoiD+ZCmKioK4RdmCiyFLQbbsUqDIFBml0JZVSgedSZ73j5BD06RtStskhftzXbkoz1nPyTnJ+eaZkhBCgIiIiOgho3B0BoiIiIgcgUEQERERPZQYBBEREdFDiUEQERERPZQYBBEREdFDiUEQERERPZQYBBEREdFDiUEQERERPZQYBBEREdFDiUEQlVsdO3aEJEno2LGjo7NCdN927twJSZIgSRJ27txZ4HonTpzAs88+i5CQEGg0GnmbmJgYs/U2btyIrl27ws/PD0qlEpIkwcfHp0zPoTiqVq0KSZIwYsQIR2eF8ijr62LrfW5vDIKcQN6bY/r06Y7ODjmJ06dPY8aMGWjfvj1CQkLg6uoKDw8PhIWFoWfPnpgzZw6uXr3q6Gw+VKZPny5/VvO+tFotAgICULNmTXTv3h1Tp07F33//XWrHPXz4MFq2bInly5fjypUryM3Ntbre119/jSeffBJ//fUXkpKSYDAYSi0PZGnEiBFm98Fzzz1n03bLly83265q1aplm1EqkMrRGSAic7du3cK4ceOwfPlyqw+xO3fuIC4uDhs2bMCkSZPw/PPP4/3334evr68DcksAkJOTgxs3buDGjRs4d+4c/vzzT7z33nuoW7cuZsyYgf79+5do/5MnT0ZmZia8vLzw4Ycfonnz5nB1dQUA1KhRAwCQkZGBt99+GwBQp04dzJw5E9WrV4dKpYJSqSzZCZJNVq1aha+//houLi6Frrds2TI75YiKwiCIyi1nKlItLRcuXMATTzyBs2fPAgACAgIwePBgtG/fHkFBQZAkCQkJCdi5cydWrVqF+Ph4fPvtt+jatSv69Onj2Mw/ZBYuXIgWLVoAAIQQSElJwY0bNxAdHY0NGzbgn3/+wenTpzFgwACMGjUK8+fPh0JhWfjesWNHFDaPdW5uLnbt2gUAGD16NF566SWr60VHRyMlJQUA8Mknn6BHjx4lPcUyERsb6+gslAkXFxekpqZi7dq1GDhwYIHrXb16FVu3bpW3ycrKslcWyQoGQUROIiMjAz179pQDoFGjRmHu3Lnw9PS0WLdv376YPXs2vv32W/zvf/+zd1YJQHh4OBo0aGCR3rdvX7z//vtYv349nnvuOdy8eRMLFiyAr68vPv7442If5+bNm8jJyQEA1KpVq8D14uPj5b8LW4/KRq9evfDrr79i2bJlhQZBK1asgF6vR3BwMKpXr47du3fbMZeUH9sEETmJyZMn49SpUwCA559/Hj/88IPVAMhEo9Hg1VdfxYEDBxASEmKvbJKNevbsiX379snXcPbs2Thy5Eix95OdnS3/rVarS7welY1hw4YBADZv3ozr168XuJ6pKmzIkCFWSwbJvngFHiA7duzA8OHDUa1aNbi5ucHLywsNGzbEm2++iYSEhEK3PXHiBGbOnImuXbuiSpUq0Gq18PDwQM2aNTF8+HAcOHCg0O3zNhgFgJSUFLz33nto0qQJfHx8IEkSFi9ebHXdrKwszJ49G02bNoWnpyc8PT3RsmVLfPnll9DpdAUes7DeYbGxsfIxTMfdsmULevbsiUqVKkGr1SI8PBwvvfQSrly5Uui5AUBSUhImTpyI2rVrw9XVFYGBgXj88cexZs0aAMDixYvl491Pcf+NGzfw/fffAwCCgoLw2Wef2bxt/fr10axZM7M0W3vO5b8W+eVvsL99+3b0798fISEhUKvVqFq1KjIyMuDp6QlJkjBkyJAi87t//355v19//bXVda5evYr//e9/aN68OXx9faHVahESEoIBAwbIVQkF0ev1WLx4Mbp27YpKlSpBo9HA29sbNWvWROfOnfHBBx/IwWZZq1mzJj788EP5/3n/Nimo14zp2oSHh8tpI0eONGtQO336dPlajxw5Ul4vPDzcbD3TfovTQ6eozhoJCQl466230LRpU3h7e0OtViMwMBANGzbEoEGDsHjxYqSmplpsZ2svpPXr16Nfv37y91HFihXRunVrfPjhh0hPTy9wu/yfRYPBgPnz56NNmzaoUKEC3N3d0ahRI7z//vvIyMgoNA/F0bVrV/j7+0On0+Hnn3+2us6JEyfk3nxDhw61ed+xsbEYP3486tevD09PT7i5uaFmzZoYM2YMjh8/btM+/vzzT3Tv3h3+/v5wc3NDrVq18Prrr5uVINriyJEjePHFF1G7dm14eHjA3d0dtWvXxksvvSSXYpcrghxux44dAoAAIKZNm1bs7TMzM8Uzzzwj78Pay93dXaxbt67I4xf2euuttwrMw7Rp0+T1zp49K6pWrWqx/aJFiyzWvXr1qoiIiCjwmD179hR6vd7qMTt06CAAiA4dOlgsu3jxotlx33rrrQKP4e/vL06dOlXguf3zzz8iMDCwwO1Hjx4tFi1aJP//4sWLBe6rIJ9//rm8/ZQpU4q9fX6FvTd55b0W1uS9L99++22Lcw8LCxNCCPHss8/K91l6enqhxxw7dqwAIFQqlbhx44bF8h9//FG4u7sXei+OGjVK5ObmWmyblpYmHnnkkSLv5aeffrrQPBYk7/u1Y8cOm7a5c+eO8PHxEQCEm5ubyMnJMVue9/OXd595j1XQa9q0afK1Luxl2m9Bx7KmsO+kv//+W3h5eRV53PXr11tsGxYWJgCI4cOHWz1uZmam6Nu3b6H7DQ4OFkePHrW6fd7P4smTJ0Xnzp0L3E/Lli2LvF8LM3z4cLPPz6uvvioAiObNm1td/8033xQAROPGjYUQ9z6nps+RNUuWLBFarbbAc1AqleKDDz4oNJ/jx48v9Pvv0KFDRV4XvV4vxo8fLyRJKnBfKpVKfPfdd1a3L869Z08MgpxASYIgg8EgevToYRY0LFu2TOzdu1fs379fzJs3T4SGhgoAQqPRiEOHDlnsY8uWLcLd3V0MGDBAfPvtt2Lnzp3iyJEjYtOmTeLTTz+VPxwAxMKFC63mI+8XdqNGjYRarRavvPKK2LJli4iOjhY//fST2Ldvn8W6bdq0ERqNRrz66qtiy5Yt4vDhw2LFihWibt268jrffvut1WPaGgS1adNGXm/FihUiOjpabN26VQwbNkxep1WrVlaPkZycLIKDg+X1hg4dKv78808RHR0tfv75Z9G6dWsBQERGRpYoCHr66afl7Q8cOFDs7fMr7SCoYcOG8r8LFy4UUVFRYteuXWLevHlCCCH+/PNPed3ly5cXeLzc3FwREBAgAIgePXpYLP/ll1/kL9lq1aqJOXPmiE2bNonDhw+LVatWie7du8vHGT9+vMX2EyZMkJc/+eST4qeffhJ79+4Vhw8fFn/++af44IMPRJs2bUS/fv0KfV9seb+K80WeN9/5r29BD4dr166J48ePi82bN8vLZ86cKY4fPy6/rl27Ji5cuCCOHz8uZs6cKa+3efNms/VMD/rSCIKysrLkz4Snp6eYOHGi+PPPP8Xhw4fF/v37xYoVK8TLL78sKleufF9B0IABA+RjN27cWCxdulQcOnRIbN68WYwcOVK+P3x9fcWVK1csts8bBLVp00YoFAoxfPhwsXHjRnH48GGxZs0a+XMLFP7jrij5g6BDhw7J/z99+rTZunq9XlSuXFkAEJ988okQouggaMOGDfL5enh4iGnTpondu3eL/fv3i08//VT4+fnJx/v666+t7mPu3LlmweMXX3whDh48KHbt2iUmTpwoNBqNqFq1qvD39y/0uvzf//2fvJ/27duLhQsXip07d4qoqCjx/fffi/r168vL165da7E9gyAqUEmCoPnz5wsAQq1Wiz///NPqOrdu3ZJv0LZt21osv3HjhkhOTi7wGNnZ2eLxxx+XP6w6nc5inbwPB4VCITZv3lzg/vKuq1arrX4gkpKS5NKXRo0aWd2PrUEQAPHCCy8Ig8Fgsd7zzz8vr3PkyBGL5ePGjZOXf/bZZxbLdTqd6N27t9mx7icIqlGjhvzeZWVlFXv7/Eo7CAIgOnfuXGDeigpuTPIGSytWrDBbduPGDeHt7S0AiOeee85qSY8QQi6RUigU4syZM2bLQkJCBIAig5ykpKRClxfkfoOgd955R95u6dKlZsuKejjkL9UsiC2lkaURBG3btk1eZi3IMcnNzRUpKSkW6YUFQRs2bDC737Kzsy3WMX3nARADBgywWJ73fQAgli1bZrFOVlaWaNCggQAgKlasWOC9VpT8QZAQQv4B9/bbb5utu2XLFgEYS24SExOFEIUHQTk5OXKw6eHhYbXkKzY2VgQFBQnAWMqYv2T12rVrws3NTT6G6bh5bdu2TahUKvk8rF2Xv/76S17+ww8/WH0vMjMzxaOPPiofK/976qxBENsElWNCCHz00UcAgFdffRXdunWzul6FChUwe/ZsAMDevXvx33//mS338/MrdERZjUYjb3/p0iWLEWrzGzFiBLp06WLTObzyyitW2634+vrKbRyOHz8ud/29H0FBQfjiiy+stnt544035L/z99LIzs6W2xO1aNECr732msX2SqUS3333XZHjghQlKSkJAODt7Q2tVluifZUFhUKBH374ocC8qVQquUeMaaA+a5YvXw4A8PDwQO/evc2WffPNN0hJSUHlypXx9ddfQ6Wy3nl1xowZqFy5MgwGA5YuXWq2zDR45COPPFLo+dh7TKWKFSvKfycnJ9v12KUt7wCd7du3L3A9lUoFLy+vYu37q6++AmBs2L1o0SJoNBqLdV544QU89thjAIDVq1cjMTGxwP099dRTePbZZy3StVotXn75ZQDGz15pthEztfVZvny52dAHpgbRjz32GCpVqlTkftasWSO35XznnXcQERFhsU5YWJj83ZyRkYFFixaZLV+yZInc7unTTz+1etxHH30UL7zwQqF5MbVle/rppzFq1Cir67i4uODLL78EYHxO7Nixo9B9OgsGQeXYqVOncP78eQBAv379Cl0375fV/v37C103OzsbcXFxOHXqFE6cOIETJ06YfZiPHTtW6Pa2NI61ZV1TY18hBC5evGjzPvPr169fgQ9vU+M+wDhGT17R0dG4ffs2AFj9IjUJDAxE165d7zt/AJCWlgYAcHd3L9F+ykrbtm2LHNXWdC1zc3Px66+/WizPzMzE77//DgDo06cP3NzczJavW7cOAPDkk08WGgiqVCq0bt0agOW9HBQUBAD45ZdfSrXRa0mZ7jHg3rUur0zvMQCLh25J6HQ6eTykLl26FNrj0fTQ1ul0hTbwtuX7BbD87JfEkCFDIEkSLl26JP+wysjIwOrVqwHY3iDa1AGgqJGo+/fvD29vb7Nt8u+jQoUKFj868ips/6mpqfJ7XNRzpm7duvDz8wNQ9HPGWTAIKseio6Plv1u3bm11OH/TK++XsLWpFu7cuYNZs2ahcePGcHd3R1hYGOrXr4+GDRuiYcOGaNKkibzuzZs3C81Xo0aNbD6HOnXqFLgs76/1kjw4CjsGYPyCsHaMEydOyH/n732VX/Pmze8zd0ambtR37twp0X7Kii3XNDIyEtWrVwdwr8Qnr3Xr1sm9evI/nPR6vVzC+N133xV6L0uShJUrVwKwvJeHDx8OANi3bx/Cw8Px8ssvY82aNbhx40bxTriU5b23ils64mzatWuHatWqAQDGjRuHli1bYtasWdi7d688ntH9uHDhghy4RkZGFrpu3uV5P6f52eP7Jb/Q0FC5dNtU+rN69Wqkp6fDw8MDffv2tWk/pvMKDw+Hv79/getpNBr5+zn/e2HqOdakSZMCS1YBICIiwmqpGwAcPXpUHrl+0KBBRX42Tc+H8jKlD4OgcqywsSgKk/8XcmxsLBo2bIi3334b//zzD/R6faHbZ2ZmFrrcFFTYIn9pQF55x9AoKk/3e4y8x8l/jLzVFoV9CdmyvCim6pKUlBSz8V6cha3X1BTc7Nu3z2KoAFNgFBAQIFdnmNy6davQ4RAKkv9enjJlCp577jlIkoTr16/jq6++wlNPPYWAgAA0aNAA06ZNw7Vr14p9nJLK+8OhvE9volarsX79etStWxcAcOjQIbz99tto164dfHx80K1bN3lAwOK4deuW/HdAQECh6+at1sm7XX72+H6xxlTa89tvvyErK0sOhp5++ukiv49MTOdV1HsB3Hs/8r8Xtu5DpVIVeF+W1nPGWXHE6HIs7wd3/fr1Nk/Cl/8DMXToUFy8eFEea+SZZ55B3bp14e/vL89WbTAY5PmH8laNWcN5ioqvcePGOHfuHAwGA2JiYor8JWxvtl7TIUOG4N1334UQAj/99BMmT54MwPhlvHnzZgDAwIEDLX6V5r2Xn3/+eavtr6zJ/+tVrVZjwYIFmDBhAn766Sds374d0dHRyMnJwcmTJ3Hy5EnMmTMHP/74Y6HVA6Xt6NGj8t+1a9e223HLSr169XD8+HGsX78e69evx99//41z584hMzMTmzdvxubNmzFnzhz88ccfNj3E8yto3Kryol+/fhg7dixSUlIwf/58bNu2DUDxxgYyKY33oiT7yPvZ/O6779CmTRubtivOj2FHYhBUjuVtbOnj42N1CP+inDlzBnv27AEAvP3225g5c6bV9Qr7tfWgyvshvnHjRqFTEZS0uqVDhw5YtWoVAGDjxo0lDoJMv3KLmkW8tKvfatWqhebNmyM6OhorVqyQg6CVK1fKVSXW2mnk/RUqhLivezmvevXq4b333sN7772HrKws7NmzBytWrMDSpUuRnp6OQYMG4fz582btW8pKRkYG9u3bB8DYNshaA1d7yVv6Udi9Yct9oVQq0adPH3nOusTERGzatAlfffUVDh8+jMOHD2PMmDHygKJFyXsPFFVal7eqxRlL1jw9PdGnTx/89NNPmDRpEvR6PapUqYJOnTrZvA/TedlScml6P/K/FxUqVMDVq1eL3IdOpyvwOz7vc8bNza3En01nw+qwcixvO529e/fe1z5Onjwp/13YfDd52x89LOrXry//ffjw4ULXLen788wzz8izgv/www8lDk5MbYyK6olUFiO8moKcEydO4J9//gFwryqsevXqVgM8jUYj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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "max_epochs = 2000\n",
    "val_interval = 20\n",
    "epoch_loss_list = []\n",
    "val_epoch_loss_list = []\n",
    "\n",
    "scaler = GradScaler(\"cuda\")\n",
    "total_start = time.time()\n",
    "\n",
    "for epoch in range(max_epochs):\n",
    "    model.train()\n",
    "    len_train_loader = len(train_loader)\n",
    "    epoch_loss = 0\n",
    "\n",
    "    for data in train_loader:\n",
    "        images = data[\"image\"].to(device)\n",
    "        classes = data[\"slice_label\"].to(device)\n",
    "        optimizer.zero_grad(set_to_none=True)\n",
    "        timesteps = torch.randint(0, 1000, (len(images),)).to(device)  # pick a random timestep\n",
    "\n",
    "        with autocast(enabled=True, device_type=\"cuda\"):\n",
    "            # Generate random noise\n",
    "            noise = torch.randn_like(images).to(device)\n",
    "\n",
    "            # Get model prediction\n",
    "            noise_pred = inferer(inputs=images, diffusion_model=model, noise=noise, timesteps=timesteps)\n",
    "            loss = F.mse_loss(noise_pred.float(), noise.float())\n",
    "\n",
    "        scaler.scale(loss).backward()\n",
    "        scaler.step(optimizer)\n",
    "        scaler.update()\n",
    "        epoch_loss += loss.item()\n",
    "    epoch_loss_list.append(epoch_loss / (len_train_loader + 1))\n",
    "\n",
    "    if epoch % val_interval == 0:\n",
    "        model.eval()\n",
    "        len_val_loader = len(val_loader)\n",
    "        val_epoch_loss = 0\n",
    "\n",
    "        for data in val_loader:\n",
    "            images = data[\"image\"].to(device)\n",
    "            classes = data[\"slice_label\"].to(device)\n",
    "            timesteps = torch.randint(0, 1000, (len(images),)).to(device)\n",
    "            with torch.no_grad():\n",
    "                with autocast(enabled=True, device_type=\"cuda\"):\n",
    "                    noise = torch.randn_like(images).to(device)\n",
    "                    noise_pred = inferer(inputs=images, diffusion_model=model, noise=noise, timesteps=timesteps)\n",
    "                    val_loss = F.mse_loss(noise_pred.float(), noise.float())\n",
    "\n",
    "            val_epoch_loss += val_loss.item()\n",
    "        val_epoch_loss_list.append(val_epoch_loss / (len_val_loader + 1))\n",
    "        print(\"Epoch\", epoch, \"Validation loss\", val_epoch_loss / (len_val_loader + 1))\n",
    "\n",
    "total_time = time.time() - total_start\n",
    "print(f\"train diffusion completed, total time: {total_time}.\")\n",
    "\n",
    "plt.style.use(\"default\")\n",
    "plt.title(\"Learning Curves Diffusion Model\", fontsize=20)\n",
    "plt.plot(np.linspace(1, max_epochs, max_epochs), epoch_loss_list, color=\"C0\", linewidth=2.0, label=\"Train\")\n",
    "plt.plot(\n",
    "    np.linspace(val_interval, max_epochs, int(max_epochs / val_interval)),\n",
    "    val_epoch_loss_list,\n",
    "    color=\"C1\",\n",
    "    linewidth=2.0,\n",
    "    label=\"Validation\",\n",
    ")\n",
    "plt.yticks(fontsize=12)\n",
    "plt.xticks(fontsize=12)\n",
    "plt.xlabel(\"Epochs\", fontsize=16)\n",
    "plt.ylabel(\"Loss\", fontsize=16)\n",
    "plt.legend(prop={\"size\": 14})\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "326101ed-333b-44a9-933f-55760b5d93a4",
   "metadata": {},
   "source": [
    "## Check the performance of the diffusion model\n",
    "\n",
    "We generate a random image from noise to check whether our diffusion model works properly for an image generation task.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8f7a9e99-a8a4-4c8f-a42f-17ef91b18585",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T14:52:12.127003Z",
     "start_time": "2024-09-11T14:51:54.276168Z"
    },
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1000/1000 [00:17<00:00, 56.32it/s]\n"
     ]
    },
    {
     "data": {
      "image/png": "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rC+Hw4GSkhIYDAZotVq88MIL+OhHP4rZ2Vn86le/wtNPP410Oo2BgQEUFRVJlHM4HBY6Y1DmwsJCRKNRvP7665iYmMDVq1dl/hl412w2C7/hqNQrV67IPPN485jq9XpcuHABhw4dkvveeecdhEIheDweaDQaeDweifibnp6GRqNRgQnzuMViMXnvlStXoNPpMD8/jwMHDmDXrl2IRCKIxWKyn/D7OIpbr9dLtGggEMD09DSuXLmCCxcuyBohIhw6dAjz8/PC94LBIE6cOCHRjlyU9J79nfKvRhGRqPyrLBqNRhAFjEYjDAYD9Ho9dDodtFot9Ho9tFotCgoKYDKZYLfbUVhYCIvFArPZLNcqn63JikrktnDblpaW5Pvs326k3DAyvEajweOPPy7hjY8++ii++tWvShjo3//932P//v2Yn59HQ0MD7rnnHkHm9vl8WL9+PXbv3o2tW7eisrISc3Nz+O1vf4unn34aRqMRt99+O+64446cMNF8JZ1OY3BwEEajEcePH4fP58NnPvMZ/M//+T/xx3/8xwAyMA8vv/wyGhsbcfz4cbzzzjuYmZkBEeH555+XZ9122234f/6f/0f1/I9//OMSmvuVr3wF//AP/4CJiQksLS3BarUilUrBZDIJYrkSDTiRSECr1WL79u0AgLKyMvT39+OVV15BR0eHINa/8847AgWQXYxGI2ZnZ+FwONDV1YXFxUU4HA5cunQJBw4cQG1tLZ588kkAGfgCRupdWlrClStXBJ1bidA+MjKCp556SvWeyspKHDp0SPr80ksvYd++fQIRsGXLFrz33nuorKzET3/6U7jdbkETbm5uhsPhwLvvvot3330X4XBYwoqdTicee+wxtLW1obi4GD/60Y/ed05Xr16NyclJVFZW4ty5czh9+jSmp6cxMTGB06dPo7GxES6XSxbJlStXcPXqVeh0OhGQgWuo99mFUeX1ej3Wrl2LX//617JhPPDAA3j11VcRiURw/vx5/OhHP0JhYSEuXrwIp9OJ5uZmXLx4ES+99BLq6uowMzOD4eFh7N+/H4cPH8bevXvl+e9Xkskk/H4/fD4fJicncfXqVfzud79DIpHAD37wAwCZw8LU1BSMRqMwuIKCAszNzakQ3LORsAHg85//PD7/+c8DAL785S/j29/+tggT0WgUoVAIbrcbRUVFeOSRR9Df349f/epX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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.eval()\n",
    "noise = torch.randn((1, 1, 64, 64))\n",
    "noise = noise.to(device)\n",
    "scheduler.set_timesteps(num_inference_steps=1000)\n",
    "with autocast(enabled=True, device_type=\"cuda\"):\n",
    "    image, intermediates = inferer.sample(\n",
    "        input_noise=noise, diffusion_model=model, scheduler=scheduler, save_intermediates=True, intermediate_steps=100\n",
    "    )\n",
    "\n",
    "chain = torch.cat(intermediates, dim=-1)\n",
    "\n",
    "plt.style.use(\"default\")\n",
    "plt.imshow(chain[0, 0].cpu(), vmin=0, vmax=1, cmap=\"gray\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "546f9983-c2e2-4c24-b03a-ebe34627638a",
   "metadata": {},
   "source": [
    "## Define the classification model\n",
    "First, we define the classification model. It follows the encoder architecture of the diffusion model, combined with linear layers for binary classification between healthy and diseased slices.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "44cc6928-2525-4e61-8805-15b409097bbb",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T14:52:12.174677Z",
     "start_time": "2024-09-11T14:52:12.128682Z"
    },
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DiffusionModelEncoder(\n",
       "  (conv_in): Convolution(\n",
       "    (conv): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "  )\n",
       "  (time_embed): Sequential(\n",
       "    (0): Linear(in_features=32, out_features=128, bias=True)\n",
       "    (1): SiLU()\n",
       "    (2): Linear(in_features=128, out_features=128, bias=True)\n",
       "  )\n",
       "  (down_blocks): ModuleList(\n",
       "    (0): DownBlock(\n",
       "      (resnets): ModuleList(\n",
       "        (0): DiffusionUNetResnetBlock(\n",
       "          (norm1): GroupNorm(32, 32, eps=1e-06, affine=True)\n",
       "          (nonlinearity): SiLU()\n",
       "          (conv1): Convolution(\n",
       "            (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (time_emb_proj): Linear(in_features=128, out_features=32, bias=True)\n",
       "          (norm2): GroupNorm(32, 32, eps=1e-06, affine=True)\n",
       "          (conv2): Convolution(\n",
       "            (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (skip_connection): Identity()\n",
       "        )\n",
       "      )\n",
       "      (downsampler): DiffusionUnetDownsample(\n",
       "        (op): Convolution(\n",
       "          (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "    (1): AttnDownBlock(\n",
       "      (attentions): ModuleList(\n",
       "        (0): SpatialAttentionBlock(\n",
       "          (norm): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (attn): SABlock(\n",
       "            (out_proj): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_q): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_k): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_v): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (qkv): Identity()\n",
       "            (input_rearrange): Rearrange('b h (l d) -> b l h d', l=1)\n",
       "            (out_rearrange): Rearrange('b l h d -> b h (l d)')\n",
       "            (drop_output): Dropout(p=0.0, inplace=False)\n",
       "            (drop_weights): Dropout(p=0.0, inplace=False)\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "      (resnets): ModuleList(\n",
       "        (0): DiffusionUNetResnetBlock(\n",
       "          (norm1): GroupNorm(32, 32, eps=1e-06, affine=True)\n",
       "          (nonlinearity): SiLU()\n",
       "          (conv1): Convolution(\n",
       "            (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (time_emb_proj): Linear(in_features=128, out_features=64, bias=True)\n",
       "          (norm2): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (conv2): Convolution(\n",
       "            (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (skip_connection): Convolution(\n",
       "            (conv): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "      (downsampler): DiffusionUnetDownsample(\n",
       "        (op): Convolution(\n",
       "          (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "    (2): AttnDownBlock(\n",
       "      (attentions): ModuleList(\n",
       "        (0): SpatialAttentionBlock(\n",
       "          (norm): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (attn): SABlock(\n",
       "            (out_proj): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_q): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_k): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_v): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (qkv): Identity()\n",
       "            (input_rearrange): Rearrange('b h (l d) -> b l h d', l=1)\n",
       "            (out_rearrange): Rearrange('b l h d -> b h (l d)')\n",
       "            (drop_output): Dropout(p=0.0, inplace=False)\n",
       "            (drop_weights): Dropout(p=0.0, inplace=False)\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "      (resnets): ModuleList(\n",
       "        (0): DiffusionUNetResnetBlock(\n",
       "          (norm1): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (nonlinearity): SiLU()\n",
       "          (conv1): Convolution(\n",
       "            (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (time_emb_proj): Linear(in_features=128, out_features=64, bias=True)\n",
       "          (norm2): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (conv2): Convolution(\n",
       "            (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (skip_connection): Identity()\n",
       "        )\n",
       "      )\n",
       "      (downsampler): DiffusionUnetDownsample(\n",
       "        (op): Convolution(\n",
       "          (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (out): Sequential(\n",
       "    (0): Linear(in_features=4096, out_features=512, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Dropout(p=0.1, inplace=False)\n",
       "    (3): Linear(in_features=512, out_features=2, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "device = torch.device(\"cuda\")\n",
    "classifier = DiffusionModelEncoder(\n",
    "    spatial_dims=2,\n",
    "    in_channels=1,\n",
    "    out_channels=2,\n",
    "    channels=(32, 64, 64),\n",
    "    attention_levels=(False, True, True),\n",
    "    num_res_blocks=(1, 1, 1),\n",
    "    num_head_channels=64,\n",
    "    with_conditioning=False,\n",
    ")\n",
    "\n",
    "classifier.to(device)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45fab83a-b4c8-42cb-96c9-4e9f1e191111",
   "metadata": {},
   "source": [
    "## Model training of the classification model\n",
    "We train our classification model for 1000 epochs.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "de18d5cb-68e7-407c-afe9-8efd7a5a904a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T15:05:06.493015Z",
     "start_time": "2024-09-11T14:52:12.176139Z"
    },
    "lines_to_next_cell": 0
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 9 Validation loss 0.27587130665779114\n",
      "Epoch 19 Validation loss 0.23130261898040771\n",
      "Epoch 29 Validation loss 0.15939612686634064\n",
      "\n",
      "Epoch 989 Validation loss 0.10873827338218689\n",
      "Epoch 999 Validation loss 0.15586623549461365\n",
      "train completed, total time: 774.1744227409363.\n"
     ]
    },
    {
     "data": {
      "image/png": "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xWKz38SJE6377N2712b7008/bd3+4Ycf2mw3mUzMkCFDROdyxhLUsGFD67UrKytz+PVS3G0JAsD069dPcWwVFRVMQkICA4C58847Fc/377//Wo+3cOFC0barV68y0dHRDADmoYcekrX0MAxjtUjp9Xrm+PHjom1169ZlADDDhg1Te9tMbm6u6naC0ArFBBGEj2AYBu+88w4A4Mknn8TAgQNl96tRowZmz54NANiyZQtOnTol2h4fH4+YmBjF8wQFBVlff/78eevsX4nx48fjtttu0/QepkyZIhu3Ehsba7U4HTp0CIWFhZqOJ0dSUhI++eQT2dn/888/b13mLAgcRqPRGk/UqVMnPPXUUzavNxgM+OqrrxASEuL0+AA25ggAoqOjERwc7NKxPIFer8e3336rOLaAgACMHDkSALBy5Urr+5Hy008/AQAiIiIwZMgQ0bYvvvgChYWFqF27Nj7//HMEBMg7Gl577TXUrl0bFosFCxYsEG3jikf26NFD9f1QTSXCXZAIIggfcfToUZw5cwYA64JSo2fPntZlObePEKPRiMzMTBw9ehSHDx/G4cOHwTCMdbs914+W4Fgt+3LBvgzD4Ny5c5qPKWXYsGGKD+8mTZogIiICAFujR8ju3btRUFAAABgzZozi8RMTEzFgwACnxwcAxcXFAIDw8HCXjuMpunXrhtTUVNV9uM+yoqICv/76q8320tJS/PHHHwCAu+++G2FhYaLtf/75JwDWjaUmBAMCAtC1a1cAtt/lpKQkAMAvv/yCGzduqI6XINwBiSCC8BG7d++2Lnft2tWacSP3j3vQA5BttVBSUoJZs2ahTZs2CA8PR0pKClq0aIFWrVqhVatWaNeunXXfa9euqY6rdevWmt9D06ZNFbcJZ+ucSHAGtXMArKVM7hyHDx+2Lkuzr6RI46wchasFVFJS4tJxPIWWzzQ9PR0NGjQAwFt8hPz555+4fv06AFvxazabrRbGr776SvW7rNPpsHjxYgC23+UHHngAALB161akpaXhiSeewNKlS3H16lXH3jBBaIREEEH4iJycHKdeJ50hZ2RkoFWrVnj55Zdx8OBBmM1m1deXlpaqbudEhRak1gAhej1/e7E3JmfPITyP9Bz5+fnW5Zo1a6oew952e8TFxQFgSwsYjUaXjuUJtH6mnLjZunWrTakAThglJCSgf//+om15eXmq5RCUkH6Xp0+fjoceegg6nQ45OTn47LPPcM899yAhIQEtW7bEjBkzrEHuBOEOKDuMIHyE8KH9119/2XVXcCQkJIj+Hjt2LM6dOwedTocHH3wQo0aNQrNmzVCzZk0EBQVBp9PBYrHAYDAAgMg1Jge3H6GdNm3a4PTp07BYLNi/fz/S09N9PSQRWj/T0aNH4//+7//AMAx+/vlnTJs2DQArcv777z8AwMiRI23ifYTf5YkTJ8rGX8kRFBQk+jswMBBz587Fc889h59//hlr167F7t27UV5ejiNHjuDIkSOYM2cOfvzxR5uYJIJwBhJBBOEjOOsBAMTExKBly5YOH+P48ePYvHkzAODll1/GG2+8IbtfXl6ec4OswgitH1evXkXjxo0V93XV3dKrVy8sWbIEAPD333+7LII465ZcA1Yh7na/NW7cGB07dsTu3buxcOFCqwhavHgxysvLAcjHgQldnwzDOPVdFtK8eXO8/vrreP3111FWVobNmzdj4cKFWLBgAa5fv4777rsPZ86cscYQEYSzkDuMIHyEME5ny5YtTh3jyJEj1mUuu0cOYfxRdaFFixbW5T179qju6+r1GTVqFEJDQwEA3377rcvihIsxErr05OD6lLkTTuQcPnwYBw8eBMC7who0aCAr8IKCgqzX29nvshIhISHo378/vvvuO2uWY2lpKZYvX+7W8xDVExJBBOEj2rdvjzp16gAAvv76a6f6RwnjMNQevF9++aXjA6zidOzYEdHR0QCAH3/8UXG/K1euWF09zlKzZk08/PDDAICsrCw8/fTTml979OhRG5GWlpYGgBU5SkHl165dw6pVq5wbsAqjRo2yus9++uknXLx40Vp+QC0bcPDgwQBY66Sr11OJfv36WZftBfgThBZIBBGEj9Dr9Xj55ZcBsOnd48aNUw2qLSoqwqeffipa16hRI+syVxNHyhdffIFly5a5PuAqRkhICMaNGwcA2LVrFz766CObfSwWCx555BG3NDB966230KxZMwCsNejhhx+2ZlPJUVFRgU8//RTp6em4cOGCaFuvXr0AAOXl5fjkk09kXztx4kS7Qe7OUKtWLfTt2xcA8PPPP2PhwoXWODI1EfTUU09ZsxgffPBBkZVSjr///ttqaQJYl+1ff/2lGrO2cuVK6zInFAnCFSgmiCDcyP79+xXFiJC+ffuiXr16ePTRR7Fq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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "max_epochs = 1000\n",
    "val_interval = 10\n",
    "epoch_loss_list = []\n",
    "val_epoch_loss_list = []\n",
    "optimizer_cls = torch.optim.Adam(params=classifier.parameters(), lr=2.5e-5)\n",
    "\n",
    "\n",
    "scaler = GradScaler(\"cuda\")\n",
    "total_start = time.time()\n",
    "for epoch in range(max_epochs):\n",
    "    classifier.train()\n",
    "    len_train_loader = len(train_loader)\n",
    "    epoch_loss = 0\n",
    "\n",
    "    for data in train_loader:\n",
    "        images = data[\"image\"].to(device)\n",
    "        classes = data[\"slice_label\"].to(device)\n",
    "\n",
    "        optimizer_cls.zero_grad(set_to_none=True)\n",
    "        timesteps = torch.randint(0, 1000, (len(images),)).to(device)\n",
    "\n",
    "        with autocast(enabled=False, device_type=\"cuda\"):\n",
    "            # Generate random noise\n",
    "            noise = torch.randn_like(images).to(device)\n",
    "\n",
    "            # Get model prediction\n",
    "            noisy_img = scheduler.add_noise(images, noise, timesteps)  # add t steps of noise to the input image\n",
    "            pred = classifier(noisy_img, timesteps)\n",
    "\n",
    "            loss = F.cross_entropy(pred, classes.long())\n",
    "\n",
    "            loss.backward()\n",
    "            optimizer_cls.step()\n",
    "\n",
    "        epoch_loss += loss.item()\n",
    "    epoch_loss_list.append(epoch_loss / (len_train_loader + 1))\n",
    "\n",
    "    if (epoch + 1) % val_interval == 0:\n",
    "        classifier.eval()\n",
    "        len_val_loader = len(val_loader)\n",
    "        val_epoch_loss = 0\n",
    "\n",
    "        for data_val in val_loader:\n",
    "            images = data_val[\"image\"].to(device)\n",
    "            classes = data_val[\"slice_label\"].to(device)\n",
    "            timesteps = torch.randint(0, 1, (len(images),)).to(\n",
    "                device\n",
    "            )  # check validation accuracy on the original images, i.e., do not add noise\n",
    "\n",
    "            with torch.no_grad():\n",
    "                with autocast(enabled=False, device_type=\"cuda\"):\n",
    "                    noise = torch.randn_like(images).to(device)\n",
    "                    pred = classifier(images, timesteps)\n",
    "                    val_loss = F.cross_entropy(pred, classes.long(), reduction=\"mean\")\n",
    "\n",
    "            val_epoch_loss += val_loss.item()\n",
    "            _, predicted = torch.max(pred, 1)\n",
    "            val_epoch_loss_list.append(val_epoch_loss / (len_val_loader + 1))\n",
    "        print(\"Epoch\", epoch, \"Validation loss\", val_epoch_loss / (len_val_loader + 1))\n",
    "\n",
    "total_time = time.time() - total_start\n",
    "print(f\"train completed, total time: {total_time}.\")\n",
    "\n",
    "# Learning curves for the Classifier\n",
    "\n",
    "plt.style.use(\"default\")\n",
    "plt.title(\"Learning Curves\", fontsize=20)\n",
    "plt.plot(np.linspace(1, max_epochs, max_epochs), epoch_loss_list, color=\"C0\", linewidth=2.0, label=\"Train\")\n",
    "plt.plot(\n",
    "    np.linspace(val_interval, max_epochs, int(max_epochs / val_interval)),\n",
    "    val_epoch_loss_list,\n",
    "    color=\"C1\",\n",
    "    linewidth=2.0,\n",
    "    label=\"Validation\",\n",
    ")\n",
    "plt.yticks(fontsize=12)\n",
    "plt.xticks(fontsize=12)\n",
    "plt.xlabel(\"Epochs\", fontsize=16)\n",
    "plt.ylabel(\"Loss\", fontsize=16)\n",
    "plt.legend(prop={\"size\": 14})\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a676b3fe",
   "metadata": {},
   "source": [
    "# Image-to-image translation to a healthy subject\n",
    "We pick a diseased subject of the validation set as input image. We want to translate it to its healthy reconstruction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "fe0d9eac-1477-4d6d-a885-d3c4acb4a781",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T15:05:06.572127Z",
     "start_time": "2024-09-11T15:05:06.494484Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minmax metatensor(0.) metatensor(0.8833)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "DiffusionModelEncoder(\n",
       "  (conv_in): Convolution(\n",
       "    (conv): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "  )\n",
       "  (time_embed): Sequential(\n",
       "    (0): Linear(in_features=32, out_features=128, bias=True)\n",
       "    (1): SiLU()\n",
       "    (2): Linear(in_features=128, out_features=128, bias=True)\n",
       "  )\n",
       "  (down_blocks): ModuleList(\n",
       "    (0): DownBlock(\n",
       "      (resnets): ModuleList(\n",
       "        (0): DiffusionUNetResnetBlock(\n",
       "          (norm1): GroupNorm(32, 32, eps=1e-06, affine=True)\n",
       "          (nonlinearity): SiLU()\n",
       "          (conv1): Convolution(\n",
       "            (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (time_emb_proj): Linear(in_features=128, out_features=32, bias=True)\n",
       "          (norm2): GroupNorm(32, 32, eps=1e-06, affine=True)\n",
       "          (conv2): Convolution(\n",
       "            (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (skip_connection): Identity()\n",
       "        )\n",
       "      )\n",
       "      (downsampler): DiffusionUnetDownsample(\n",
       "        (op): Convolution(\n",
       "          (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "    (1): AttnDownBlock(\n",
       "      (attentions): ModuleList(\n",
       "        (0): SpatialAttentionBlock(\n",
       "          (norm): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (attn): SABlock(\n",
       "            (out_proj): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_q): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_k): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_v): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (qkv): Identity()\n",
       "            (input_rearrange): Rearrange('b h (l d) -> b l h d', l=1)\n",
       "            (out_rearrange): Rearrange('b l h d -> b h (l d)')\n",
       "            (drop_output): Dropout(p=0.0, inplace=False)\n",
       "            (drop_weights): Dropout(p=0.0, inplace=False)\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "      (resnets): ModuleList(\n",
       "        (0): DiffusionUNetResnetBlock(\n",
       "          (norm1): GroupNorm(32, 32, eps=1e-06, affine=True)\n",
       "          (nonlinearity): SiLU()\n",
       "          (conv1): Convolution(\n",
       "            (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (time_emb_proj): Linear(in_features=128, out_features=64, bias=True)\n",
       "          (norm2): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (conv2): Convolution(\n",
       "            (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (skip_connection): Convolution(\n",
       "            (conv): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "      (downsampler): DiffusionUnetDownsample(\n",
       "        (op): Convolution(\n",
       "          (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "    (2): AttnDownBlock(\n",
       "      (attentions): ModuleList(\n",
       "        (0): SpatialAttentionBlock(\n",
       "          (norm): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (attn): SABlock(\n",
       "            (out_proj): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_q): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_k): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (to_v): Linear(in_features=64, out_features=64, bias=True)\n",
       "            (qkv): Identity()\n",
       "            (input_rearrange): Rearrange('b h (l d) -> b l h d', l=1)\n",
       "            (out_rearrange): Rearrange('b l h d -> b h (l d)')\n",
       "            (drop_output): Dropout(p=0.0, inplace=False)\n",
       "            (drop_weights): Dropout(p=0.0, inplace=False)\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "      (resnets): ModuleList(\n",
       "        (0): DiffusionUNetResnetBlock(\n",
       "          (norm1): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (nonlinearity): SiLU()\n",
       "          (conv1): Convolution(\n",
       "            (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (time_emb_proj): Linear(in_features=128, out_features=64, bias=True)\n",
       "          (norm2): GroupNorm(32, 64, eps=1e-06, affine=True)\n",
       "          (conv2): Convolution(\n",
       "            (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "          )\n",
       "          (skip_connection): Identity()\n",
       "        )\n",
       "      )\n",
       "      (downsampler): DiffusionUnetDownsample(\n",
       "        (op): Convolution(\n",
       "          (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (out): Sequential(\n",
       "    (0): Linear(in_features=4096, out_features=512, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Dropout(p=0.1, inplace=False)\n",
       "    (3): Linear(in_features=512, out_features=2, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "idx_unhealthy = np.argwhere(data_val[\"slice_label\"].numpy() == 0).squeeze()\n",
    "idx = idx_unhealthy[4]  # Pick a random slice of the validation set to be transformed\n",
    "inputimg = data_val[\"image\"][idx]  # Pick an input slice of the validation set to be transformed\n",
    "inputlabel = data_val[\"slice_label\"][idx]  # Check whether it is healthy or diseased\n",
    "print(\"minmax\", inputimg.min(), inputimg.max())\n",
    "\n",
    "plt.figure(\"input\" + str(inputlabel))\n",
    "plt.imshow(inputimg[0, ...], vmin=0, vmax=1, cmap=\"gray\")\n",
    "plt.axis(\"off\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "model.eval()\n",
    "classifier.eval()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0cd48c2d",
   "metadata": {},
   "source": [
    "### Encoding the input image in noise with the reversed DDIM sampling scheme\n",
    "In order to sample using gradient guidance, we first need to encode the input image in noise by using the reversed DDIM sampling scheme.\\\n",
    "We define the number of steps in the noising and denoising process by L.\\\n",
    "The encoding process is presented in Equation 6 of the paper \"Diffusion Models for Medical Anomaly Detection\" (https://arxiv.org/pdf/2203.04306.pdf).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f71e4924",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T15:05:11.996586Z",
     "start_time": "2024-09-11T15:05:06.573889Z"
    },
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 200/200 [00:05<00:00, 37.53it/s]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbsAAAG7CAYAAABaaTseAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA6WElEQVR4nO3dd5RVVbbv8QklqchFzkkRJBhABJGg4hUwgiBgQmhR8NoimG1RMcCFKyjqBVHURkTFHLgNNGICAyiIAQGbJueigCJn3h+v3xi371u/6TnbKrUX38+fczLP2bXP3mdxxphr7gJHjx49agAARKzgb30AAADkNxY7AED0WOwAANFjsQMARI/FDgAQPRY7AED0WOwAANFjsQMARO+4VP9hgQIF8vM4AABIJJXZKPyyAwBEj8UOABA9FjsAQPRY7AAA0WOxAwBEj8UOABC9lLceJFG/fn2ZW7duXTBetmxZWVO8eHGZO3z4cDC+c+dOWXPw4EGZ279/f1rvY6a3ZxQuXFjWFClSROYKFgz/X+TQoUOyxnPcceGPW8XN9DnyzoP3N6kW4UKFCsmaI0eOpP1eXiuy+nu98+qdI/VemZmZsubAgQMyl+RzVzXeuUt6HSkZGRkyp64X73NSx+f9Tfv27ZM5xfseSPI3Jdmm5V0PSc6R93rlypWTOfW951H3bosWLWTN4sWLZa5u3brB+Jw5c9I7sP+FX3YAgOix2AEAosdiBwCIHosdACB6LHYAgOgVOJrKBE379QZBex1sWVlZMqc6tJJ2Y6rTkqTG6+jyOkzzsnvSq/OOb/fu3TKneB1d6u/1uuj27NmT9jF41LWc4q2QJ7yOVXUPePegej2vc9Gj3su7VrzzpzoXt2/fLmuKFSuW1rGZ+R2mSb7DvJq9e/cG415nseqaVfGfo95r165dsqZkyZIyp+qSdDd7322dO3eWub/+9a/BuOrgN2MQNAAAZsZiBwA4BrDYAQCix2IHAIgeix0AIHosdgCA6P1mWw8qVqwYjOfm5sqaE044QeZUG7A3sNh7L9WynWRorHfuvFZu1SLstZN7r6falIsWLSpr1N/rtXgn2f7gfU7e1gM1ZNt7PXUevO0ASbZ7eLeW1/6tPg/vGNTrqfZ9M7/dfceOHcG4dy0n2brh3YPq2L1tKt7nrnjXsnc/qe8c7xwl2fbiHYO6JrzvCG97l9o2tGTJEllTpUqVYLxhw4ayZuHChTK3Zs0amVPYegAAgLHYAQCOASx2AIDosdgBAKLHYgcAiJ5u78oDjRs3ljnVcbZ169ZE76W6nLzOwCRdSV5HXJJOQ+8YFK+L7sCBAzJXokSJYNzrxlTHt2zZMllTpkwZmVPDXL3zWr58eZlTkgzwzc7OljXeOVddg0mH8arjK1u2rKxRA5W9Y/A+J9XlmmSAtZm+B7zPXR27d417nbtJOla960h19SbpXPc6Qr1rT3Vdeh2r3v2+cePGYNwbCK+u1xUrVsgab6h/km7MVPDLDgAQPRY7AED0WOwAANFjsQMARI/FDgAQPRY7AED08nXrgWpjNTOrXr16MO61FatWXzPdauu1/e/cuVPm1GBR7xhUu7YalGrmt16rdmTVvm+mW9DN9DYMrw1YbQXxtogk2T6itnqY+W3PealChQoyV65cOZlT12xOTo6s8f5eNfjX20bgtacrVatWlTl1HXlDib2/yRtMrKjPvVq1arLGa+FPUuPdn3m5xSDJcZvp7ylv68GWLVtkzvtOVDZv3hyMJ9lek5/4ZQcAiB6LHQAgeix2AIDosdgBAKLHYgcAiB6LHQAgeilvPUjSpuzV1KpVKxj3JqeXKlVK5lRbttdK67UO5+bmBuM7duyQNeqpAqo19+eOYcOGDcF4kjZuM91y7LUiH0u8px5412WNGjWC8RNPPFHWeNszSpcuHYx7LfeqTf+HH36QNc2aNZO52bNnB+PexHyv3V3dh96WDnX+1Pkx8+8NtUXE207hUdsFvO0KaouIV1O8eHGZU1sPvK0M3lMe1Geo3sd7Pe9pJWvXrpW5/MIvOwBA9FjsAADRY7EDAESPxQ4AED0WOwBA9FLuxty2bZt+EdFJ5HX57dmzJxhftmyZrPG6iFSnpjdw1OusTMIb0Bwb1U1rZnbSSSfJnPrcvSHCCxculLm2bdsG494AcNWxpzoQzcwaNmwoc3PmzAnGr776allz6aWXytyHH34YjPfr10/WjB8/Phjv3r27rHnyySdl7tZbbw3Gv/76a1nz008/yZz6fL0OWNXN53VjJhmW7dUk6T5N0jXuSTIk2nsfdQ+a6c56bxi76tT0vl9Vt3t+4pcdACB6LHYAgOix2AEAosdiBwCIHosdACB6LHYAgOgVOOpN+PwfypQpI3NqQG2SrQLeFgc1yNVMtxXn5OTImk2bNslc0mHLOPbUr18/GPda8fPatGnTgvFOnTolej11P/3Xf/2XrPn8889lbtKkSWkfQ+PGjYNxbzvAmjVrZE7Ved8rFSpUkDnVju8Nt1bv5W0v8AZBHzx4MBj3th54w+fVwG5vcLk6PjUg3cxs9erVMue9l5LKMsYvOwBA9FjsAADRY7EDAESPxQ4AED0WOwBA9FjsAADRS/mpB96UapXLzMyUNYUKFQrGvZbZjIwMmVOT0FVrrtm/7vYCtdXD7Nh68sKvyWtt9lq5fy1Jtxgo5557bjD+ySefyJpPP/007fdRWxzM9HWunjZg5rfwq61Q3neb94QA9VQX9RQYM33s3lM6vGNQT3Xxvke941Ov551zxXvqQZLX+6X4ZQcAiB6LHQAgeix2AIDosdgBAKLHYgcAiF7K3ZhJZGVlyZzqPvIGTq9atUrmsrOzUz6uf3W/h47L0aNHy9zgwYNlLsW54//k99DtmMTNN98sc0888UTar/fdd9/J3JQpU4LxRx55JO33MTObOXNmMH7WWWfJGtVh7alYsaLMqevc6+TzuhBVp2aRIkVkjeq4NNNDnb1rXL2XN4zaO6/qXHgdl15ODcv2ukXV/Vm4cOG0a/ITv+wAANFjsQMARI/FDgAQPRY7AED0WOwAANFjsQMARC9ftx6oNlYz3dJ7LG0h+LXNnTs3GD/jjDPSfq1BgwbJnBq4a2Z27bXXBuMTJ06UNR07dpS56dOnB+PDhw+XNW+++WYw7l173nYKdXw5OTmyJq8HS6t7La/fp02bNjLnnXN1jpYsWSJrmjRpEoyXKFFC1qxcuVLmvIHKinf+1HdY1apV067xeFsF1L3m/a3eAHy1xcDbeqB4Q7mTvN4vxS87AED0WOwAANFjsQMARI/FDgAQPRY7AED08rUbs3Tp0jKXm5sbjHudR14XkZf7PTv55JNlbuHChcH4kCFDZM3DDz8sc3feeWcw/vHHH8uanj17BuNeJ9+KFStkrnz58sG417m1detWmVNuvfVWmZs1a1ba77N69WqZU8OHVaeomdnkyZNlbtKkScH4ggULZE2jRo2C8Zdeeint9zEz++CDD4JxbxD0mjVrZK5GjRoyp6jOyqTHoK4xbwjz7t27ZU4pVapUnh5DwYL6N4m6D70aL5eRkRGMe8OyFa/Gy3mDvn8JftkBAKLHYgcAiB6LHQAgeix2AIDosdgBAKLHYgcAiF6+bj1o2LChzBUvXjwY94YIe+3uaqBs9erVZc3ixYtlTg3x7devn6wpXLhwMO4NOfbabNXf6w2n9bYeVKlSJRi/8sorZc2PP/4YjI8aNUrWlC1bVubUFhFv+8PatWtl7plnngnGP/roI1mj2uq9QcZ33323zKnPw7tevc+wd+/ewfiLL74oa5QPP/xQ5rxrT12zFStWlDUXXHBB6gf2C6jtK2b+EGb1nbN9+3ZZ421pWrRoUTB+wgknyJqNGzcG4/v37090DAcPHgzGva083tYDNUBafbd5r+d9l5csWVLm1La0X4pfdgCA6LHYAQCix2IHAIgeix0AIHosdgCA6LHYAQCiV+Co1wP9P/+h00atNG7cWObUpHivZdZrQU+iU6dOMjdt2rRgvGPHjrLGm3Kv3HLLLTL3+OOPB+Pz58+XNc2aNUv7GNTTFczMvvzyy2C8f//+ssa7pLZs2RKMP/roo7JmxIgRMpfE8uXLg/Fvv/1W1nhbTrKzs4NxbwuGt91j/fr1wXiJEiVkjdqW4D1twLtWsrKygvEXXnhB1njUtg5vS4dSrVo1mVOfhZlZq1atgvF169bJGnWtmOktAd52J/W9590zmZmZMqfa/nfu3ClrChUqJHPqqQcq7uW887BhwwaZW7VqlcwpqSxj/LIDAESPxQ4AED0WOwBA9FjsAADRY7EDAEQvX7sxzz77bJkrWrRoMO4Np/WGkc6YMSMY94a8lilTRuYU73QlOUdq0LKZ7pqaPHmyrClVqpTMDR48OBhP8RL4J/fff7/MnXLKKTLXpUuXtN/r1FNPlblvvvkmGG/SpImseeqpp4Lx9u3by5qvv/5a5po3bx6Me+f1ueeek7k//OEPMqe8++67wfill14qa7wuRNXx2LNnT1nTvXt3mbvsssuC8V69esmaN998Mxg/cOCArDn++ONlTnVzN23aVNY0atRI5lRXdJ06dWTN0qVLg3E10NnM7PDhwzKnvi83b94sa7zvUZVL0sGpBs+b6UH7Zsm67unGBADAWOwAAMcAFjsAQPRY7AAA0WOxAwBEj8UOABC94/LzxVWbrZkedtugQQNZ420V+Oijj9KuScLbXjBgwIBgfNy4cbLGaw1X589r+/eGBavj8P4mNSR66NChsqZz584ypwYTjx07Nu1j8Hz//fcy521lULyhyWrg81//+ldZ89prr8mc2lqirvGkpk6dKnM33XRTMN66dWtZ89hjj8nclClTgvGRI0fKGm+LgbJs2bK0a+bNm5foGNT9uWLFClmjthF42wG8e1oNzi9WrJis2b9/v8wVKVIkrbjHGx69Z8+etF/vl+KXHQAgeix2AIDosdgBAKLHYgcAiB6LHQAgeix2AIDo5etTDxo3bixzP/zwQzDer18/WTN79myZW7JkSeoHloJPPvkkGG/btq2sueKKK4LxV155RdZ4p3/06NHB+K233ipr7rvvPplT2wW8LSKq7X/v3r2ypk+fPjKn/t7KlSvLmk2bNqX9eq1atZI1AwcODMbffvttWeM9IeDVV18NxqtXry5rvOPr1q1bMN6iRQtZ06ZNm2Dce4qIevKImb7f69atK2t69+4tc2q7TF4/RSSveU9uWbRoUTCutteY6Wn/3v2ktheY6W0Eu3btkjVJlCxZUuYKFgz/ZvLOg3c/bdu2LfUD+weeegAAgLHYAQCOASx2AIDosdgBAKLHYgcAiF6+DoL2ur2UZ599Nh+OJMzr4Pniiy/Sfr2XX345GPcGw6rOQDOzMWPGBONDhgyRNUkGNGdmZsqaN954Q+YUrxtTnVevw/SGG26Qub59+wbjb731lqypWrVqMO6dO29wc8uWLYPxa665RtZ8+eWXMteuXbtg/Pzzz5c1arCuNxDYo+4Nr0PSG+KuXu/ee+9N78Cc1zLL+w7OgwcPylyTJk2Cce9+KlSoUDCuBuOb6UHjZmbZ2dnB+JEjR2SN1/mpBud73+WqG9M7D97g6/zCLzsAQPRY7AAA0WOxAwBEj8UOABA9FjsAQPRY7AAA0cuTrQeq5dhrvVatrHPmzJE1ed1y7A3+7dKlS9rvo46ve/fuskYNezbTWwxUm7mZ2cMPPyxz06ZNC8a981qxYsW0j2HBggUy1759+2A8NzdX1owcOVLmXnjhhWD8+eeflzWKGlZsZnbnnXfK3H/8x38E4961ogZsm5mdcsopwbh3fOoeTHrPXHfddTKn9OjRQ+aaNWsWjI8dO1bWqO0ov+aA6Pnz58tczZo1g3FvqLm6bzZs2CBrvLb/nTt3ylwSO3bsSLtGbSM4cOCArPG2RuQXftkBAKLHYgcAiB6LHQAgeix2AIDosdgBAKKXJ92YS5YsCca9zsDNmzcH4173mNepWa1atWDcG7TctWtXmVPH4Q277dChQzA+a9YsWdOpU6e0j8HjDda96KKLgvEkw33VAFozs6ysLJnzOmAVrxMyCTWo+vjjj5c13bp1kznVWTl+/HhZozouzXTXbMeOHWXN9ddfH4yfeuqpsiaJ2bNny5w3fFt17HnnYdSoUcF4kvvCTF/n5cuXlzWNGjWSOXUcqkvTzOy448JfuevWrZM13iDoQ4cOpRU384dbq3vX6wgtUqRIMF6iRAlZowZi5yd+2QEAosdiBwCIHosdACB6LHYAgOix2AEAosdiBwCIXoGjKfbxeu2v27dvD8br1asna/7+978H43/6059kzSOPPCJzzzzzTDB+9913y5otW7bInNrmcNZZZ8ma3r17B+MTJ06UNUkGS3s1//3f/y1zF1xwQTDuDaNWA3wffPBBWeMNOVbn/I477pA1EyZMkLnixYsH47Vr15Y1ahi1t1XGu00aNmwYjKstOT9n7969wfjll18ua+65555gvFWrVrLmueeek7nhw4cH43/7299kzYUXXihzU6dODcZXrlwpa9Q1ptr3zcyeffZZmfvyyy+DcW+7TsmSJWVODTr22vTVAOTPP/9c1pQrV07mcnJygnFvQPS+fftkTg1+9/4m9Xl4WzpWrVolc95QbCWVZYxfdgCA6LHYAQCix2IHAIgeix0AIHosdgCA6LHYAQCil/JTD+rXry9z8+bNC8bV9gIz3QbvtX+r1mEzPfU96YT0sWPHBuNlypSRNS+++GIw7rUOe8entjJ457Vu3boyd/vttwfjr776qqwZNGhQMN60aVNZ4z3lQRk2bJjMqevLTLf9qyc8mJl17tw5GPeuvauuukrmFi9eHIx/8MEHsua8886TuWLFigXjc+fOlTUtWrSQOaVgQf1/XfUZettUvG0vy5cvD8YfeughWfPCCy8E497TJG688UaZS/IEiKpVq8qcmupfq1YtWbNjx45g3Pte8T4n9fQAtcXh53Jq24tXk5GREYyXKlVK1hw+fFjm8gu/7AAA0WOxAwBEj8UOABA9FjsAQPRY7AAA0Ut5ELRHDePds2ePrOnevXswXqVKFVlz5513ypzqmlKdQmZ+h1GS06IGNHtdeUuXLpW5SpUqBeOqA8vMrEGDBjJ34oknBuNqMLKZ2bvvvhuMly5dWtZ4evToEYw3btxY1owbN07m1q1bF4wnGbD9wAMPyJrPPvtM5mbOnBmMP/HEE7LmzDPPlDk1FHvatGmyRnWLeoPLBw4cKHPe+ctL3n2mzkPNmjVlzR//+EeZ69OnTzDuXctep7LqXFRxM/09tXHjxrRrzPRQ523btsmaQ4cOyZzqoPQGQavvI28Q9OrVq2Vu8+bNMqcwCBoAAGOxAwAcA1jsAADRY7EDAESPxQ4AED0WOwBA9FIeBN2lSxeZU1sMVKu7mdnrr78ejHtt+tWqVZM51Xpao0YNWbNq1SqZU+69916ZU8Ncr7vuOlmzYsUKmfvzn/8cjC9btkzWfPjhhzLXsmXLYNz7m1Rbttfq67Wtq3PhDUb2dO3aNRhPsnXEG1xbu3ZtmWvXrl0w/umnn6ZdY2b2ySefBOPeMHbVyv3GG2/Imnr16smc+jy6desma2644QaZK1y4cDA+dOhQWfPKK68E45dccoms8ajB0mo7jJlZkSJFZG7nzp3BuLelKTs7OxhXWwjMzLZu3SpzBw8eDMa97Q+enJycYNzb7qS2JWRmZsqa/fv3p3dgeYBfdgCA6LHYAQCix2IHAIgeix0AIHosdgCA6LHYAQCil/JTD5JMke/bt6+sycrKCsYfffRRWZObmytzM2bMCMYvv/xyWdOzZ0+ZU5PGR48eLWvUOZo/f76s6dSpk8xt2rQprfcxM5s9e7bMqQn4F110kayZOnVqMJ5064Ga7l65cmVZ471Xhw4dgnFvC8vVV18djHvt33PnzpW5NWvWBOPqGjfTLd5mZhUrVgzGvWnwapK91zLuPeVB/b2HDx+WNeq8ejlvG4F64kZSzZo1C8a/+eYbWeNdewULhn8reFsP1FNYvCcReE9l2L17d9qvl4TaOmKmtxh49/TatWtlbteuXakf2D/w1AMAAIzFDgBwDGCxAwBEj8UOABA9FjsAQPRSHgTtUcN4L730Ullz0003BeOjRo1KdAyqG8fr7vzqq69krk+fPmkfw/vvvx+Mqy4ws2RdjV7NiBEjZK5NmzZpv54a7uud12HDhsmc6tBKcr7NzGbNmhWMe12DL730UjA+ceJEWVOhQgWZmzx5cjDudVx6Q6fXr18fjJ966qmy5ttvvw3G33rrLVmj7luPN2j88ccfl7lzzz03GE/Scel1MHsd22qAuhpkbGZ2xhlnpP1627dvlzVqsLQ37NmjriPvPHjd0qrD1BvqXKxYsWDcO6/e6yXpxkwFv+wAANFjsQMARI/FDgAQPRY7AED0WOwAANFjsQMARC9Pth4MGTIkGD/ttNNkzZNPPhmMN23aVNaccMIJMqeGGavtAGZmAwcOlDk1+LR58+ay5tVXXw3GZ86cKWvGjh0rc0ncddddMue1RCutWrUKxr2tAt5WBtWC7g1u7tGjh8x99tlnwfhxx+lLu2PHjsH4fffdJ2tWrVolcy1btgzGkwxPN9PXWPv27WWN2grSrVs3WaMGWJuZ1ahRIxj3BmJ7WzfKli0bjKv2fTOz119/PRj3hrF7n/vOnTvTOjYzfX2Z6UHf3vBtNSTaux4OHjwoc0mGUXvXZZKB4ur1vOP2tgblF37ZAQCix2IHAIgeix0AIHosdgCA6LHYAQCilyfdmGo47E8//SRr6tevH4x7XUnPPfeczNWuXVvmlA4dOqRdozouzfRAYDV42MzsvPPOkznVjeZ1U3kddmXKlAnGvQG+t9xySzD+yiuvyBqvI2748OHBeHZ2tqyZMmWKzKlz8dhjj8ka9Td55/Xuu++WOdV1rLqUzfRnYaaH+M6fP1/W1KtXLxh//vnnZc2kSZNkTvHOg5dTnc/qnjEz69y5czA+Z84cWfPJJ5/I3B//+Mdg3BtuffLJJ8uc+py8oc6qI9r73tuzZ4/Mqe5J7/W8XJJjUK/ndVyq485P/LIDAESPxQ4AED0WOwBA9FjsAADRY7EDAESPxQ4AEL082Xqwbt26YNxr7VftqhMmTJA1/fr1kzk1YNhrK/balFUb+p///GdZM2PGjGD8nnvukTUeNcTX266wcuVKmdu2bVsw7g3C3bx5czBeoUIFWdOrVy+Z+/7774Pxt99+W9Z06tRJ5hYuXBiMJxmEq1rJf06pUqXSPoYNGzbIXO/evYNx73NSW2/OPPNMWdOlSxeZS3LNnn322TL31VdfBeMXXnihrBk/fnww7g0097Ygffzxx8G4N+R76dKlMqe22HgDkHft2iVzSahB0J4kA8ozMjLSfh/v2LxjyC/8sgMARI/FDgAQPRY7AED0WOwAANFjsQMARI/FDgAQvTzZeqAmzKt2YzOzqVOnBuPe9gKPmiJ/zjnnyBqvRV614HrttKqmY8eOsmbYsGEyp9pzL7nkElnTpk0bmVPHl2QK+umnn572+5jpJwHs3LlT1rzzzjsyp6bSexPXlb59+8rcm2++KXPq7/WeUjBy5EiZa9CgQTD+wQcfyJpFixYF4927d5c1+/btk7kk2rVrJ3NDhw4Nxr/44gtZo66xWrVqyRq1DcTMrGLFisF40aJFZY23zUFtVfHa6lULf9JtL0nu3SQ13v2kvhO9rTe/BX7ZAQCix2IHAIgeix0AIHosdgCA6LHYAQCiV+Boktac//0iCYZ6tm/fPhj/6KOPZM2//du/ydzMmTODce/PO/XUU2VODVtu2bKlrHnppZeCcW/Isef4448Pxr2hrN6w4I0bNwbj1atXlzWzZ88Oxr3P/M4775S5ESNGyJzy2muvydzll18ejHufu7r21KBgM7MmTZrInBoI/O///u+yxusAvOqqq4Jx75xffPHFwfh7770na1555RWZGzNmTDBev359WTNnzhyZU9183hBmdZ17A+bXrl0rc+r8rVixQtYUK1ZM5vbs2ROMq65PMz0AfP/+/bLGu9/LlSsXjOfk5Mga7zo6dOhQMF64cGFZo85RjRo1ZI16eICZHljvSWUZ45cdACB6LHYAgOix2AEAosdiBwCIHosdACB6LHYAgOilvPXAa9NfuHBh2m88adKktGt++uknmXvwwQeD8SuuuELWeK3XyimnnCJz6jzccsstsmb8+PEyd/311wfjDz/8sKzxBlVnZmYG414rsro8ktSYmTVv3jwY7927t6zJzs6WObVFZPjw4bLmL3/5SzDufRb9+/eXOcU7D0m26+S1KlWqyJxqkfd42ynU0GnvPKhc7dq1Zc3y5ctl7teS5Dx4vHNUqVKlYHzr1q2yplChQjK3e/fuYNz7m9Tr1axZU9asX79e5th6AABAQix2AIDosdgBAKLHYgcAiB6LHQAgeix2AIDohce1BxQvXlzmrr766mD8nXfekTVqsvtNN90ka8aNGydzffv2DcZHjRola5YuXSpz7777bjDeqlUrWaPaX71p+l67u3qCQYkSJWSN16bsPbEhL02YMEHm5s+fH4x752jo0KEy17Zt22Dca0WeOHFiMP7WW2/JmtatW8ucejKEd70moZ6CYWa2bNmyYHzYsGGyZtGiRTKnrr2nnnpK1iRpq/c+J5X7PWwv8BQpUkTmjhw5EowfOHBA1pQvX17m1HeB9xQF75yr7UnqyR5m+qkM3tMafgv8sgMARI/FDgAQPRY7AED0WOwAANFjsQMARC/lbszPPvtM5lRn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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "L = 200\n",
    "current_img = inputimg[None, ...].to(device)\n",
    "scheduler.set_timesteps(num_inference_steps=1000)\n",
    "\n",
    "progress_bar = tqdm(range(L))  # go back and forth L timesteps\n",
    "for t in progress_bar:  # go through the noising process\n",
    "    with autocast(enabled=False, device_type=\"cuda\"):\n",
    "        with torch.no_grad():\n",
    "            model_output = model(current_img, timesteps=torch.Tensor((t,)).to(current_img.device))\n",
    "    current_img, _ = scheduler.reversed_step(model_output, t, current_img)\n",
    "\n",
    "plt.style.use(\"default\")\n",
    "plt.imshow(current_img[0, 0].cpu(), vmin=0, vmax=1, cmap=\"gray\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7c8346a-6296-4800-b978-c10fcdf09779",
   "metadata": {},
   "source": [
    "### Denoising process using gradient guidance\n",
    "From the noisy image, we apply DDIM sampling scheme for denoising for L steps.\\\n",
    "Additionally, we apply gradient guidance using the classifier network towards the desired class label y=0 (healthy). This is presented in Algorithm 2 of https://arxiv.org/pdf/2105.05233.pdf, and in Algorithm 1 of https://arxiv.org/pdf/2203.04306.pdf. \\\n",
    "The scale s is used to amplify the gradient."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "7ab274bd-ea60-4674-b59b-d41de98fee5b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T15:05:24.800379Z",
     "start_time": "2024-09-11T15:05:11.997493Z"
    },
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 200/200 [00:12<00:00, 15.77it/s]\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "y = torch.tensor(0)  # define the desired class label\n",
    "scale = 6  # define the desired gradient scale s\n",
    "progress_bar = tqdm(range(L))  # go back and forth L timesteps\n",
    "\n",
    "for i in progress_bar:  # go through the denoising process\n",
    "    t = L - i\n",
    "    with autocast(enabled=True, device_type=\"cuda\"):\n",
    "        with torch.no_grad():\n",
    "            model_output = model(\n",
    "                current_img, timesteps=torch.Tensor((t,)).to(current_img.device)\n",
    "            ).detach()  # this is supposed to be epsilon\n",
    "\n",
    "        with torch.enable_grad():\n",
    "            x_in = current_img.detach().requires_grad_(True)\n",
    "            logits = classifier(x_in, timesteps=torch.Tensor((t,)).to(current_img.device))\n",
    "            log_probs = F.log_softmax(logits, dim=-1)\n",
    "            selected = log_probs[range(len(logits)), y.view(-1)]\n",
    "            a = torch.autograd.grad(selected.sum(), x_in)[0]\n",
    "            alpha_prod_t = scheduler.alphas_cumprod[t]\n",
    "            updated_noise = (\n",
    "                model_output - (1 - alpha_prod_t).sqrt() * scale * a\n",
    "            )  # update the predicted noise epsilon with the gradient of the classifier\n",
    "\n",
    "    current_img, _ = scheduler.step(updated_noise, t, current_img)\n",
    "    torch.cuda.empty_cache()\n",
    "\n",
    "plt.style.use(\"default\")\n",
    "plt.imshow(current_img[0, 0].cpu().detach().numpy(), vmin=0, vmax=1, cmap=\"gray\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d2e343f8-c6f3-4071-a5e6-771e2343c3bc",
   "metadata": {
    "lines_to_next_cell": 2
   },
   "source": [
    "# Anomaly Detection\n",
    "To get the anomaly map, we compute the difference between the input image the output of our image-to-image translation model towards the healthy reconstruction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ecffaaf3-a7df-453e-81a9-757113d85084",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-11T15:05:24.913542Z",
     "start_time": "2024-09-11T15:05:24.803285Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "diff = abs(inputimg.cpu() - current_img[0, 0].cpu()).detach().numpy()\n",
    "plt.style.use(\"default\")\n",
    "plt.imshow(diff[0, ...], cmap=\"jet\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "formats": "py:percent,ipynb"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
